July 10, 2020
이처럼 실행에 필요한 정보를 형상화, 구분하기위해 실행컨텍스트를 물리적 객체의 형태로 관리함.
const Execution_Context = {
Variable_Object: {
// vars, function_declarations, arguments, etc
},
Scope_Chain: [
// Variable_Object, all_parant_scopes
],
thisValue: 'Context_Object',
}
실행 컨텍스트가 생성되면, 자바스크립트 엔진은 실행에 필요한 여러 정보들을 담은 객체를 생성한다. 이를 Variable Object(VO/변수객체)라고 한다. VO는 코드가 실행될 때 엔진에 의해 참조되며, 코드에서 접근할 수 없다.
VO는 실행 컨텍스트의 속성(위 객체를 보삼)으로, 객체의 값을 갖는다.
그런데, 전역코드로 생성되는 GEC의 VO와 함수로 생성되는 FEC의 VO가 가리키는 객체가 서로 다르다.
const Globl_Execution_Context = {
Variable_Object: {
// Global Object(Go) 라고 함.
foo: function() {
console.log('전역함수 foo')
},
var: '전역변수 var',
},
// ... 이하동일
}
const Function_Execition_Context = {
Variable_Object: {
// Actibation Object(AO) 라고 함.
arrguments: {},
innerFunction: function() {
'내부함수'
},
innerVar: '지역변수 innerVar',
},
// ... 이하동일
}
전역 또는 함수가 참조할 수 있는 변수, 함수선언 등의 정보를 담고있는 전역객체(GO) 또는 활성객체(AO)의 리스트를 가리킨다.
자바스크립트는 스코프 체인을 통해 렉시컬 스코프(해당 변수/함수의 위치)를 파악한다.
함수가 중첩되어있을 경우, 가장 내부의 함수는 부모함수와 전역의 변수를 참조할 수 있다. 함수실행중, 변수를 만나면 현재Scope에서 탐색하고, 없으면 상위로 올라가면서 찾는다.
function outerScope() {
let variable = '외부변수'
function innerScope() {
variable = '내부변수' // 지우면 외부변수가 출력됨
console.log(variable)
}
innerScope()
}
outerScope()
this 프로퍼티에는 this의 값이 할당된다.